package com.generic;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Vhong
 * @version 1.0
 */
@SuppressWarnings({"all"})
public class GenericDetail {
    public static void main(String[] args) {
        //给泛型指向数据类型是，要求是引用类型，不能是基本数据类型
        List<Integer> list = new ArrayList<Integer>();
        //List<int> list2 = new ArrayList<int>();//不是引用类型

        //2.说明
        //因为E 指定了A类型,构造器传入new A()
        //在给泛型指定具体类型后，可以传入该类型或其子类类型
        Pig<A> apig = new Pig<A>(new A());
        apig.f();
        Pig<B> bpig = new Pig<B>(new B());
        bpig.f();

        //3.泛型的使用方式
        ArrayList<Integer> list1 = new ArrayList<Integer>();
        List<Integer> list2 = new ArrayList<Integer>();

        //在实际开发中，我们往往简写
        //编译器会进行类型推断，推荐使用下面写法
        ArrayList<Integer> list3 = new ArrayList<>();
        List<Integer> list4 = new ArrayList<>();

        ArrayList<Pig> pigs = new ArrayList<>();

        //4.如果这样写 泛型默认是Object
        ArrayList arrayList = new ArrayList();
        //等价于ArrayList<Object> arraylist = new Arraylist<>();
        //arrayList.add(Object e);
        

   Tiger tiger = new Tiger();
    /*
class Tiger<Object>{
    Object e;

        public Tiger() {
    }
    public Tiger(Object e) {
        this.e = e;
    }
}
     */

    }
}
class A{}
class B extends A{}
class Pig<E> {
    E e;
    public Pig(E e){
        this.e = e;
    }
    public void f(){
        System.out.println(e.getClass());
    }
}
class Tiger<E>{
    E e;

    public Tiger() {
    }

    public Tiger(E e) {
        this.e = e;
    }
}